Los vectores los creamos con elementos del mismo tipo a través de la función c( ) (concatenar). En caso de mezclar caracteres con datos numéricos, el vector se considerará caracter.
## [1] 1.00 4.00 3.14 -2.00
Dimensión/largo del vector
## [1] 4
Vectores reciclados
## [1] 1.5 4.0 3.5 6.0
## [1] 1.5 4.0 3.5 6.0
Un escalar es un caso especial
## [1] 3 -3 7
## Warning in c(0.5, 2) + c(4, -1, 10): longer object length is not a multiple
## of shorter object length
## [1] 4.5 1.0 10.5
Obs: No reciclar para no tener sorpresas en los cálculos.
Algunas funciones operan sobre todo un vector y no sobre cada elemento.
## [1] 1 4 9
## [1] 11
Algunas otras funciones: mean(),max(), min(),median(), sd(), var().
Supongamos que obtuvimos algunos valores de mediciones de ph y queriamos ponerlos en una escala estandarizada: \[ph^* = \dfrac{x_i- mean(x)}{sd(x)}\]
ph <- c(1.1,3.0,4.2,0.7,7.1,8,5.6,13.3,12.0)
z <- (ph - mean(ph)) / sd(ph) # z = ph estandarizado
round(z, 2) # redondeamos a 2 decimales## [1] -1.12 -0.70 -0.43 -1.21 0.22 0.42 -0.11 1.61 1.32
Ejercicio: Realizar la función scale() sobre el vector de datos y comparar.
Las funciones class() o str() nos indican que tipo de vectores tenemos.
## [1] -2.00 -0.25 1.50 3.25 5.00
## [1] -1 0 1 -1 0 1 -1 0 1
## [1] -1 -1 -1 0 0 0 1 1 1
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
# creamos un factor con tres niveles, a, b y c
mi.factor <- factor( sample( letters[1:3], 20, replace = T ) )
mi.factor## [1] a b c b c c a c a c c b a a a b c c a c
## Levels: a b c
## [1] "a" "b" "c"
# preferimos la ordenación b, c, a
mi.factor <- factor( mi.factor, levels = levels( mi.factor )[ c( 2,3,1 ) ] )
levels( mi.factor ) # b, c, a## [1] "b" "c" "a"
first_names <- c("Pedro", "Catalina", "Roberto","Andrea")
name_lengths <- nchar(first_names) # numero de caracteres
name_lengths## [1] 5 8 7 6
## [1] TRUE TRUE TRUE TRUE
Obs: Se puede realizar calculos con vectores lógicos, porque You can do math with logical vectors, because TRUE=1 y FALSE=0
Si quisieramos solo los nombres con más de 6 letras:
## [1] FALSE TRUE TRUE FALSE
Si quisieramos solo los nombres donde la cuanrta letra es “r”:
# substr: substring (porción) de un char vector
letra.4 <- substr(first_names, start=4, stop=4) == "r"
letra.4## [1] TRUE FALSE FALSE TRUE
## [1] FALSE FALSE FALSE FALSE
## [1] TRUE TRUE TRUE TRUE
## [1] TRUE FALSE FALSE TRUE
## [1] TRUE TRUE TRUE TRUE
## [1] "Catalina" "Roberto"
# Si tenemos un vector con los sexos
sex <- c("M","F","M","F")
first_names[sex=="M"] # para comparar usar doble signo = (==)## [1] "Pedro" "Roberto"
# Veamos si nuestra lista coincide en algun nombre con este vector
first_names %in% c("Roberto", "Carla", "Daniel")## [1] FALSE FALSE TRUE FALSE
# Obtenemos la posición dentro de nuestro vector
which(first_names %in% c("Roberto", "Carla", "Daniel"))## [1] 3
## [1] "Roberto"
Un valor perdido es codificado como NA sin "".
## [1] NA
Problemas!… los NA no dejan hacer cálculos correctamente. que hacer? remover los valores uno por uno… que lata…
## [1] 0
## [1] FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE
Como manejar los NA
## [1] FALSE FALSE NA FALSE TRUE NA NA FALSE
## [1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [1] FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE
## [1] -Inf -Inf NaN Inf Inf
## [,1] [,2] [,3] [,4] [,5]
## [1,] FALSE FALSE FALSE FALSE FALSE
## [2,] FALSE FALSE TRUE FALSE FALSE
Una Matriz extiende los vectores a dos dimensiones. Veamos algunos comandos útiles
## [,1] [,2] [,3] [,4]
## [1,] "a" "c" "e" "g"
## [2,] "b" "d" "f" "h"
## [,1] [,2] [,3] [,4]
## [1,] "a" "b" "c" "d"
## [2,] "e" "f" "g" "h"
## [,1] [,2] [,3]
## [1,] 2 4 6
## [2,] -1 0 -3
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
## [3,] 5 3 5
## [4,] 3 4 6
Aquí tenemos un problema…
## [,1] [,2] [,3] [,4]
## [1,] "a" "c" "e" "g"
## [2,] "b" "d" "f" "h"
## [1] "b" "d" "f" "h"
## [1] "b" "d" "f" "h"
Ahora el comando para ver el tamaño es dim()
## [1] 2 4
matrix <- cbind(c("SI","NO"), c(18,31))
# nombramos las filas y columnas
rownames(matrix) <- c("Pedro", "Carla")
colnames(matrix) <- c("Fuma", "Edad")
matrix## Fuma Edad
## Pedro "SI" "18"
## Carla "NO" "31"
¿Algún problema?
## [1] "character"
Una Lista es un objecto que puede almacenar muchos tipos de datos
(mi.lista <- list("letras" = letters[1:4],
"matriz" = matrix(8:11, nrow = 2),
"resultados" = lm(dist ~ speed, data = cars)))## $letras
## [1] "a" "b" "c" "d"
##
## $matriz
## [,1] [,2]
## [1,] 8 10
## [2,] 9 11
##
## $resultados
##
## Call:
## lm(formula = dist ~ speed, data = cars)
##
## Coefficients:
## (Intercept) speed
## -17.579 3.932
Como acceder a cada conjunto de datos en una lista?
## [1] "a" "b" "c" "d"
## [1] "a" "b" "c" "d"
## [1] "a" "b" "c" "d"
Resolvamos los ejercicios propuestos con lo que hemos aprendido hasta el momento.
Obs: todos los str_ son cargando la libreria stringr.
frases <- c("Chile se divide en regiones", "La región del Biobío esta en Chile",
"El sur de chile es lo mejor")
patron <- '(en|Chile)' # o "en|Chile"## [1] 1 2
## [1] "Chile se divide en regiones"
## [2] "La región del Biobío esta en Chile"
## [1] TRUE TRUE FALSE
## [[1]]
## [1] "" " se divide " " regiones"
##
## [[2]]
## [1] "La región del Biobío esta " " "
##
## [[3]]
## [1] "El sur de chile es lo mejor"
## [[1]]
## start end
## [1,] 1 5
## [2,] 17 18
##
## [[2]]
## start end
## [1,] 27 28
## [2,] 30 34
##
## [[3]]
## start end
## [[1]]
## [1] "Chile" "en"
##
## [[2]]
## [1] "en" "Chile"
##
## [[3]]
## character(0)
## [,1] [,2]
## [1,] "Chile" "en"
## [2,] "en" "Chile"
## [3,] "" ""
Realize un vector que diga “iter 1”, “iter 2”,…, “iter 5”.
## [1] "iter 1" "iter 2" "iter 3" "iter 4" "iter 5"
Fácil!… pero si necesitamos que sea un vector de la forma “iter 1”,…, “iter 1.000”
## [1] "iter 45" "iter 573" "iter 784" "iter 395" "iter 311" "iter 520"
## [7] "iter 297" "iter 892" "iter 258" "iter 941"
Resolvamos los ejercicios propuestos con la ayuda de las expresiones regulares.